--***********************************************************
--**                    THE INDIE STONE                    **
--***********************************************************

require "ISUI/ISScrollingListBox"

WorldSelect = ISPanelJoypad:derive("WorldSelect")

local FONT_HGT_SMALL = getTextManager():getFontHeight(UIFont.Small)

function WorldSelect:initialise()
	ISPanelJoypad.initialise(self)
end

function WorldSelect:hasChoices()
	if isClient() then return false end
	self.mapGroups:createGroups()
	return self.mapGroups:getNumberOfGroups() > 1
end

function WorldSelect:fillList()
	self.listbox:clear()
	for i=1,self.mapGroups:getNumberOfGroups() do
		local item = {}
		-- TODO: if only vanilla maps, set item.name = "Kentucky, USA"
		item.name = getText("UI_WorldSelect_WorldN", i)
		item.world = i
		item.mapDirs = self.mapGroups:getMapDirectoriesInGroup(i-1)
		if item.mapDirs:size() == 1 then
			local mapDir = item.mapDirs:get(0)
			local info = getMapInfo(mapDir)
			if info and info.title then
				item.name = info.title
			else
				item.name = mapDir
			end
		end
		self.listbox:addItem(item.name, item)
	end
	self:onSelectWorld()
end

function WorldSelect:onSelectWorld()
	self.mapListbox:clear()
	local mapDirs = self.listbox.items[self.listbox.selected].item.mapDirs
	for i=1,mapDirs:size() do
		local mapDir = mapDirs:get(i-1)
		local item = {}
		local info = getMapInfo(mapDir)
		if info and info.title then
			item.name = info.title
		else
			item.name = mapDir
		end
		self.mapListbox:addItem(item.name, item)
	end
	self.mapListbox:sort()
end

function WorldSelect:onOptionMouseDown(button, x, y)
	self:setVisible(false)
	if button.internal == "BACK" then
		self:clickBack()
	elseif button.internal == "NEXT" then
		self:clickNext()
	end
end

function WorldSelect:onDblClick()
	self:clickNext()
end

function WorldSelect:clickBack()
	if getWorld():getGameMode() == "Multiplayer" then
		backToSinglePlayer()
		getCore():ResetLua("default", "exitJoinServer")
	elseif self.previousScreen == "LoadGameScreen" then
		MainScreen.resetLuaIfNeeded()
		self.previousScreen = nil
		LoadGameScreen.instance:setSaveGamesList()
		MainScreen.instance.loadScreen:setVisible(true, self.joyfocus)
	elseif self.previousScreen == "NewGameScreen" then
		self.previousScreen = nil
		MainScreen.instance.soloScreen:setVisible(true, self.joyfocus)
	end
end

function WorldSelect:clickNext()
	self:setVisible(false)
	self.mapGroups:setWorld(self.listbox.selected-1)
	if MainScreen.instance.createWorld or MapSpawnSelect.instance:hasChoices() then
		MapSpawnSelect.instance:fillList()
		MapSpawnSelect.instance.previousScreen = "WorldSelect"
		MapSpawnSelect.instance:setVisible(true, self.joyfocus)
	elseif getWorld():getGameMode() == "Sandbox" then
		MapSpawnSelect.instance:useDefaultSpawnRegion()
		MainScreen.instance.sandOptions:setVisible(true, self.joyfocus)
	else
		MainScreen.instance.charCreationProfession.previousScreen = "WorldSelect"
		MainScreen.instance.charCreationProfession:setVisible(true, self.joyfocus)
	end
end

function WorldSelect:render()
	ISPanelJoypad.render(self)
	self:drawTextCentre(getText("UI_WorldSelect_title"), self.width / 2, 10, 1, 1, 1, 1, UIFont.Title)
	self:drawRectBorder(self.listbox:getX(), self.listbox:getY(), self.listbox:getWidth(), self.listbox:getHeight(), 0.9, 0.4, 0.4, 0.4)
	self:drawRectBorder(self.mapListbox:getX(), self.mapListbox:getY(), self.mapListbox:getWidth(), self.mapListbox:getHeight(), 0.9, 0.4, 0.4, 0.4)
end

function WorldSelect:doDrawItem(y, item, alt)
	if self.itemsSelectable then
		local isMouseOver = self.mouseoverselected == item.index and not self:isMouseOverScrollBar()
		if self.selected == item.index then
			self:drawRect(0, (y), self:getWidth(), item.height-1, 0.3, 0.7, 0.35, 0.15)
		elseif isMouseOver then
			self:drawRect(1, y + 1, self:getWidth() - 2, item.height - 2, 0.95, 0.05, 0.05, 0.05)
		end
	end
	self:drawRectBorder(0, (y), self:getWidth(), item.height, 0.5, self.borderColor.r, self.borderColor.g, self.borderColor.b)
	local fontHgt = getTextManager():getFontFromEnum(UIFont.Large):getLineHeight()
	local textY = y + (item.height - fontHgt) / 2
	self:drawText(item.text, 15, textY, 0.9, 0.9, 0.9, 0.9, UIFont.Large)
	y = y + item.height
	return y
end

function WorldSelect:onGainJoypadFocus(joypadData)
	ISPanelJoypad.onGainJoypadFocus(self, joypadData)
	self.listbox:setISButtonForA(self.nextButton)
	self.listbox:setISButtonForB(self.backButton)
	self.listbox:setJoypadFocused(true, joypadData)
end

function WorldSelect:onJoypadBeforeDeactivate(joypadData)
	-- focus is on listbox
	self.backButton:clearJoypadButton()
	self.nextButton:clearJoypadButton()
end

function WorldSelect:onJoypadBeforeDeactivate_listbox(joypadData)
	self.parent:onJoypadBeforeDeactivate(joypadData)
end

function WorldSelect:onResolutionChange(oldw, oldh, neww, newh)
	local padX = 16
	self.listbox:setWidth((self.width - padX * 3) / 2)
	self.mapListbox:setX(self.listbox:getRight() + padX)
	self.mapListbox:setWidth(self.width - padX * 3 - self.listbox:getWidth())
end

function WorldSelect:create()
	local padX = 16
	local btnWid = 100
	local btnHgt = math.max(25, FONT_HGT_SMALL + 3 * 2)
	local btnPadY = 5
	local startY = 80

	self.listbox = ISScrollingListBox:new(padX, startY, (self.width - padX * 3) / 2, self.height-30-30-startY)
	self.listbox:initialise()
	self.listbox:instantiate()
	self.listbox:setAnchorLeft(true)
	self.listbox:setAnchorRight(false)
	self.listbox:setAnchorTop(true)
	self.listbox:setAnchorBottom(true)
	self.listbox.itemheight = 50
	self.listbox.doDrawItem = WorldSelect.doDrawItem
	self.listbox.itemsSelectable = true
	self.listbox:setOnMouseDownFunction(self, WorldSelect.onSelectWorld)
	self.listbox:setOnMouseDoubleClick(self, WorldSelect.onDblClick)
	self.listbox.onJoypadBeforeDeactivate = self.onJoypadBeforeDeactivate_listbox
	self.listbox.backgroundColor  = {r=0, g=0, b=0, a=0.5}
	self:addChild(self.listbox)

	self.mapListbox = ISScrollingListBox:new(self.listbox:getRight() + padX, startY, self.width - padX - self.listbox:getRight() - padX, self.height-30-30-startY)
	self.mapListbox:initialise()
	self.mapListbox:instantiate()
	self.mapListbox:setAnchorLeft(true)
	self.mapListbox:setAnchorRight(false)
	self.mapListbox:setAnchorTop(true)
	self.mapListbox:setAnchorBottom(true)
	self.mapListbox.itemheight = 50
	self.mapListbox.doDrawItem = WorldSelect.doDrawItem
	self.mapListbox.itemsSelectable = false
	self.mapListbox.backgroundColor  = {r=0, g=0, b=0, a=0.5}
	self:addChild(self.mapListbox)

	self.backButton = ISButton:new(padX, self.height - btnPadY - btnHgt, btnWid, btnHgt, getText("UI_btn_back"), self, WorldSelect.onOptionMouseDown)
	self.backButton.internal = "BACK"
	self.backButton:initialise()
	self.backButton:instantiate()
	self.backButton:setAnchorLeft(true)
	self.backButton:setAnchorTop(false)
	self.backButton:setAnchorBottom(true)
	self.backButton.borderColor = {r=1, g=1, b=1, a=0.1}
	self:addChild(self.backButton)

	self.nextButton = ISButton:new(self.width - 116, self.height - btnPadY - btnHgt, btnWid, btnHgt, getText("UI_btn_next"), self, WorldSelect.onOptionMouseDown)
	self.nextButton.internal = "NEXT"
	self.nextButton:initialise()
	self.nextButton:instantiate()
	self.nextButton:setAnchorLeft(false)
	self.nextButton:setAnchorRight(true)
	self.nextButton:setAnchorTop(false)
	self.nextButton:setAnchorBottom(true)
	self.nextButton:setEnable(true) -- sets the hard-coded border color
	self:addChild(self.nextButton)
end

function WorldSelect:new(x, y, width, height)
	local o = ISPanelJoypad.new(self, x, y, width, height)
	o.previousScreen = 'NewGameScreen'
	o.mapGroups = MapGroups.new()
	WorldSelect.instance = o
	return o
end

